package analyze;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;

public class Demo {
	static Connection conn=null;	//	连接对象
	static PreparedStatement stmt=null;	//	发送sql语句
	static ResultSet rs=null;	//	sql返回的结果集
	static String[] sSex = { 
		"男", "女" };	//性别
	static String[] sSize = { "4", "6", "8" };	//房间大小
	static HashMap<String, String> h1=new HashMap<String, String>();//	四 女 分寝结果 班级名 姓名
	static HashMap<String, String> h2=new HashMap<String, String>();//	六 女
	static HashMap<String, String> h3=new HashMap<String, String>();//	四 男
	static HashMap<String, String> h4=new HashMap<String, String>();//	八 女
	static HashMap<String, String> h5=new HashMap<String, String>();//	六 男 
	static HashMap<String, String> h6=new HashMap<String, String>();//	八 男 
	static Student student=new Student();	//student 的实例
	static int numClass;	//班级中分配寝室的数量，例如java技术（4人间，男）的寝室的分配数量
	static int numKernel;	//班级中核心人员的数量，例如java技术（4人间，男）性格结果为唐僧类型的人员数量
	/*分寝算法实现
	 * 通过分析测试题统计出的人员性格结果
	 * 胆汁质（猪八戒1）  多血质（孙悟空1） 粘液质（沙僧1） 抑郁质（唐僧1）
	 * String[] sTemp = {"choleric","sanguine","phlegmatic","melancholic",
				"choleric-sanguine","choleric-phlegmatic","choleric-melancholic",
				"sanguine-phlegmatic","sanguine-melancholic","phlegmatic-melancholic",
				"choleric-sanguine-phlegmatic","choleric-sanguine-melancholic","sanguine-phlegmatic-melancholic",
		"choleric-sanguine-phlegmatic-melancholic"};
	 * 
	 * 1，按照班级分配
	 * 2，寝室类型
	 * 		男 4 安静 规律 胆汁质（猪八戒1）  多血质（孙悟空1） 粘液质（沙僧1） 抑郁质（唐僧1）
	 * */
	public static void main(String[] args) {
		allot();
		
			
		}
	//	分配成员
	public static void allot(){
		ArrayList<String> className=new ArrayList<String>();//		班级种类
		//		从数据库获得班级的种类
		className=findClass();
		//		便利班级种类
		for (String name : className) {
			//			便利性别男女
			for(int i=0;i<sSex.length;i++){
				//				便利房间大小4,6,8
				for(int j=0;j<sSize.length;j++){
					numClass =Integer.valueOf(findNum(name, "4",sSex[i]))/Integer.valueOf(sSize[j]);//	同一班级选4人间女，应该分配的寝室数量
					numKernel =Integer.valueOf(findDormitoryNum(name, "4", sSex[i]));//同一班级中核心人员的数量
					if(numClass<numKernel){
						//				将第一个人直接加入map集合
						h1.put(name, findMelancholicName(name, "4", "女"));
						//				将分配后的人员通过id标记，以后便不再查询此数据
						setSign(student.getId());
						//				加入第二个人
						h1.put(student.getClassName(), findCholericName(name, "4", "女" ));
					}else{

					}

				}
			}
		}
	}

	//	班级类型
	public static ArrayList<String> findClass(){
		//		查询班级的种类
		String sql ="select distinct className from student";
		//		班级类型
		ArrayList<String> className=new ArrayList<String>();
		//		获得数据库连接
		conn= Conn.getConn();
		try {
			//	执行sql语句
			stmt=conn.prepareStatement(sql);
			//	班级的种类
			rs=stmt.executeQuery();
			while(rs.next()){
				//				将查询出的结果返回到className
				className.add(rs.getString(1));
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			//			关闭数据库连接
			Conn.close(conn, stmt, rs);
		}
		//		返回班级的类型
		return className;
	}

	//	根据传入班级名称统计班级统计（班级，4，男性）人员数量，用于决定分配寝室的数量 
	public static String findNum(String name,String roomSize,String sex){
		//		统计班级数量的sql语句
		String sql="select count(*) from student where className = ? and roomSize= ? and sex= ? ";
		conn=Conn.getConn();
		try {
			stmt=conn.prepareStatement(sql);
			//				根据班级的名称统计班级的人员数量			
			stmt.setString(1,name);
			stmt.setString(2,roomSize);
			stmt.setString(3,sex);
			//				执行查询
			rs=stmt.executeQuery();
			while(rs.next()){
				return rs.getString(1);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			Conn.close(conn, stmt, rs);
		}
		//		失败返回0
		return "0";
	}
	//	将已经分配的人员标记为1，代表应经分配过寝室
	public static void setSign(String id){
		String sql="update student set sign='1' where id=?";
		conn=Conn.getConn();
		try {
			stmt=conn.prepareStatement(sql);
			stmt.setString(1, id);
			stmt.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			Conn.close(conn, stmt, rs);
		}
	}
	//	寝室的核心人员的寻找 数量
	public static String findDormitoryNum(String className,String roomSize,String sex){
		//		寝室的核心人员数量sql查询语句 核心人员为领导型
		String sql1="select count(*) from student where className = ? and roomSize= ? and sex=? like '%elancholi%'";
		conn=Conn.getConn();
		try {
			stmt=conn.prepareStatement(sql1);
			stmt.setString(1, className);
			stmt.setString(2, roomSize);
			stmt.setString(3, sex);
			rs=stmt.executeQuery();
			while(rs.next()){
				return rs.getString(1);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			Conn.close(conn, stmt, rs);
		}
		//		失败返回空	
		return null;
	}
	//	寝室的核心人员的寻找 返回name
	//	"choleric","sanguine","phlegmatic","melancholic",
	public static String findMelancholicName(String className,String roomSize,String sex){
		//		寝室的核心人员数量sql查询语句 核心人员为领导型
		String sql1="select id,className,name from student where className = ? and roomSize= ? and sex=? and sign='1' like '%elancholi%'";
		conn=Conn.getConn();
		try {
			stmt=conn.prepareStatement(sql1);
			stmt.setString(1, className);
			stmt.setString(2, roomSize);
			stmt.setString(3, sex);
			rs=stmt.executeQuery();
			while(rs.next()){
				//				为bean对象赋值
				student.setId(rs.getString(1));
				student.setClassName(rs.getString(2));
				student.setName(rs.getString(3));
				return rs.getString(3);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			Conn.close(conn, stmt, rs);
		}
		//		失败返回空	
		return null;
	}
	//	寝室的choleric人员的寻找返回 name
	public static String findCholericName(String className,String roomSize,String sex){
		//		寝室的核心人员数量sql查询语句 核心人员为领导型
		String sql1="select id,className,name from student where className = ? and roomSize= ? and sex=? and sign='0' like '%holeri%'";
		conn=Conn.getConn();
		try {
			stmt=conn.prepareStatement(sql1);
			stmt.setString(1, className);
			stmt.setString(2, roomSize);
			stmt.setString(3, sex);
			rs=stmt.executeQuery();
			while(rs.next()){
				student.setId(rs.getString(1));
				student.setClassName(rs.getString(2));
				student.setName(rs.getString(3));
				return rs.getString(3);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			Conn.close(conn, stmt, rs);
		}
		//		失败返回空	
		return null;
	}
	//	寝室的sanguine人员的寻找返回 name
	public static String findSanguineName(String className,String roomSize,String sex){
		//		寝室的核心人员数量sql查询语句 核心人员为领导型
		String sql1="select id,className,name from student where className = ? and roomSize= ? and sex=? and sign='0' like '%anguin%'";
		conn=Conn.getConn();
		try {
			stmt=conn.prepareStatement(sql1);
			stmt.setString(1, className);
			stmt.setString(2, roomSize);
			stmt.setString(3, sex);
			rs=stmt.executeQuery();
			while(rs.next()){
				student.setId(rs.getString(1));
				student.setClassName(rs.getString(2));
				student.setName(rs.getString(3));
				return rs.getString(3);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			Conn.close(conn, stmt, rs);
		}
		//		失败返回空	
		return null;
	}
	//	寝室的phlegmatic人员的寻找返回 name
	public static String findPhlegmaticName(String className,String roomSize,String sex){
		//		寝室的核心人员数量sql查询语句 核心人员为领导型
		String sql1="select id,className,name from student where className = ? and roomSize= ? and sex=? and sign='0' like '%hlegmati%'";
		conn=Conn.getConn();
		try {
			stmt=conn.prepareStatement(sql1);
			stmt.setString(1, className);
			stmt.setString(2, roomSize);
			stmt.setString(3, sex);
			rs=stmt.executeQuery();
			while(rs.next()){
				student.setId(rs.getString(1));
				student.setClassName(rs.getString(2));
				student.setName(rs.getString(3));
				return rs.getString(3);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			Conn.close(conn, stmt, rs);
		}
		//		失败返回空	
		return null;
	}
}